#include <iostream>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>

#include<functional>
#include<vector>


// 测试打印的时候  IO
//  void handlerSig(int sig)
//  {
//      std::cout<<"获得一个信号： "<<sig<<std::endl;
//      exit(11);
//  }

// 测试 非打印  只记录数字  会发现 4亿多
//  int cnt=0;
//  void handlerSig(int sig)
//  {
//      std::cout<<"获得一个信号:"<<sig<<" cnt:"<<cnt<<std::endl;
//      exit(11);
//  }

// 测试IO和对应计数    以及时钟
//  int main()
//  {
//      // for(int i =1;i<32;i++)
//      //     signal(i,handlerSig);   //捕捉所有信号

//     signal(SIGALRM,handlerSig);
//     alarm(1);    //设定1s闹钟，1s之后当前进程会收到一个信号     设置一个闹钟  之后一直打印

//     // int cnt = 0;
//     while(true)
//     {
//         // std::cout<<"count: "<<cnt++<<std::endl;     //测试的IO  打印的效率不高   基本10w次
//         cnt++;
//     }
//     return 0;
// }





// 测试闹钟特征
//  void handlerSig(int sig)
//  {
//      std::cout<<"获得一个信号: "<<sig<<",pid:"<< getpid() <<std::endl;      //执行信号处理的依旧是一个进程
//      int n = alarm(1);      
//      std::cout<<"n: "<<n<<std::endl;     //输出0  因为重新设置闹钟   上一个闹钟已经结束
//  }

// int main()
// {
//     signal(SIGALRM,handlerSig);
//     alarm(1);     //闹钟是是一次性的闹钟   想要一直有闹钟   就把闹钟加到handlerSig中

//     while(true)
//     {
//         std::cout<<".,"<<"pid: "<<getpid()<<std::endl;
//         sleep(1);
//     }
//     return 0;
// }





// /////   func   //////
// void Sched()
// {
//     std::cout<<"我是进程调度"<<std::endl;
// }

// void MemManger()
// {
//     std::cout<<"我是周期性的内存管理，正在检查有没有内存问题"<<std::endl;
// }

// void Fflush()
// {
//     std::cout<<"我是刷新程序，我在定期刷新内存数据"<<std::endl;
// }
// /////////////////////

// using func_t = std::function<void()>;     //定义了一种新的函数类型   等价typedef     
// std::vector<func_t> funcs;      //定义一个容器


// //测试每隔一秒就做一次工作
// void handlerSig(int sig)
// {
//     // std::cout << "获得一个信号：" << sig << "  pid: " << getpid() << std::endl;
//     // int n = alarm(1);   
//     std::cout<<"############################"<<std::endl;
//     for(auto i: funcs)
//         i();    //遍历一下方法
//     std::cout<<"############################"<<std::endl;
//     int n = alarm(1);
// }

// int main()
// {
//     funcs.push_back(Sched);
//     funcs.push_back(MemManger);
//     funcs.push_back(Fflush);
//     signal(SIGALRM,handlerSig);
//     alarm(1);

//     // 想让进程什么都不做   让进程暂停
//     // 来一个信号就唤醒一次    执行一次方法

//     //可以让一个进程处于暂停状态   让外部信号来驱动每隔一秒来进行的任务     
//     //这就是操作系统！操作系统最初就处于死循环
//     while (true)
//     {
//         pause(); // 测试pause 暂停
//     }
//     return 0;
// }





void handlerSig(int sig)
{
    std::cout<<"  hello sig: "<<sig<<std::endl;
    signal(2,SIG_DFL);     //2  默认动作是终止
    std::cout<<"恢复处理动作"<<std::endl;
}

int main()
{
    signal(2,handlerSig);    //自定义捕捉
    // signal(2,SIG_IGN);    //这个是忽略信号    对于2号，信号忽略   

    while(true)
    {
        sleep(1);
        std::cout<<"."<<std::endl;
    }

    return 0;
}
